/*
 * Narrativa de todo o jogo
 */
package br.edu.unipampa.narrativa;

import br.edu.unipampa.cenario.Cenario;
import br.edu.unipampa.cenario.Local;
import br.edu.unipampa.desafio.Desafio;
import br.edu.unipampa.personagem.Personagem;
import br.edu.unipampa.recurso.Agua;
import br.edu.unipampa.recurso.Alimento;
import br.edu.unipampa.recurso.Ambiente;
import br.edu.unipampa.recurso.Cantil;
import br.edu.unipampa.recurso.Mapa;
import br.edu.unipampa.recurso.Pessoal;
import java.util.Scanner;
import javax.swing.JOptionPane;

/**
 *
 * @author Kezia Lobo
 */
public class Narrativa {

    int escolhaJogador;
    Personagem mensageiro;
    Local charco;
    Local deserto;
    Local passagemNorte;
    Local passagemSul;
    Local poco;
    Local faseFinal;
    Local entrePosto1;
    Local entrePosto2;
    Local entrePosto3;
    Local entrePosto4;
    Local entrePosto5;
    Local entrePosto6;
    Local entrePosto7;
    Local entrePosto8;
    Alimento carne;
    Alimento maca;
    Alimento laranja;
    Alimento frango;
    Alimento pessego;
    Alimento banana;
    Cenario alegrete;
    Desafio sobreviverAgua;
    Desafio atravessarRio;
    Desafio derrotarGuardas;
    Agua agua;
    Ambiente canoa;
    Ambiente faca;
    Cantil cantil;
    Pessoal mapa;
    Scanner teclado;

    public static void main(String args[]) {

        Narrativa historia = new Narrativa();
        historia.teclado = new Scanner(System.in);
        historia.CriaCenarios();
        historia.CriaPersonagem(JOptionPane.showInputDialog("Digite seu Nome!"));
        historia.Escolha(historia.poco, historia.mensageiro);
    }

    /**
     * Inicialização e criação dos objetos da declarados do tipo Local
     */
    public void CriaCenarios() {
        CriaRecursosDeAmbiente();
        CriaDesafios();
        CriaAlimentos();
        poco = new Local("Campo", agua, 20, "Missao");
        poco.setNarrativa("\nDevido ao grande perigo da missão, você"
                + " não possui muitas alternativas de caminhos a ir,"
                + "só existe dois lugares que você pode passar sem ser"
                + " descoberto:\nA Estrada do Deserto e A Estrada do Charco."
                + " Mas ambos tem suas peculiaridades e perigos"
                + "\nnão esqueça que necessitará de vários elementos"
                + " importantes para cumprir a missão\n");

        entrePosto1 = new Local("Entre Posto 1", laranja, "EntrePosto");
        entrePosto2 = new Local("Entre Posto 2", null, "EntrePosto");
        entrePosto3 = new Local("Entre Posto 3", null, "EntrePosto");
        entrePosto4 = new Local("Entre Posto 4", pessego, "EntrePosto");
        deserto = new Local("Deserto", sobreviverAgua, 20, "Missao");
        deserto.setNarrativa("\nEstá completamente escuro,"
                + " você sente o ar da noite, o céu está repleto de estrelas,"
                + "\nolha as areias que formam o caminho, e a vegetação"
                + " rala e escassa que a região árida apresenta-lhe.  "
                + "\nCalcula que conseguirá atravessar o deserto no mínimo,"
                + " em cinco dias, e que deverá ter uma boa provisão de água.\n");

        entrePosto5 = new Local("Entre Posto 5", carne, "EntrePosto");
        entrePosto6 = new Local("Entre Posto 6", banana, "EntrePosto");

        charco = new Local("Charco", canoa, 30, "Missao");
        charco.setNarrativa("\nDevido a inúmeros banhados, rios e corredeiras,"
                + " você deverá tomar muito cuidado,\no céu estrelado está perfeito,"
                + " a lua ilumina-lhe o caminho, mas você sabe que não pode confiar,"
                + "\npois apesar do Charco ser a rota mais rápida, "
                + "é a rota mais perigosa e íngreme."
                + "\nHá duas passagem por esse caminho que você deve escolher,"
                + " a do Sul ou a do Norte,"
                + " seja sábio em sua decisão.\n");

        passagemNorte = new Local("Passagem Norte", 20, "Missao");
        passagemSul = new Local("Passagem Sul", atravessarRio, 10, "Missao");

        entrePosto7 = new Local("Entre Posto 7", frango, "EntrePosto");
        entrePosto8 = new Local("Entre Posto 8", maca, "EntrePosto");
        faseFinal = new Local("Castelo", derrotarGuardas, 206, "Missao");

        poco.setProximoCenario(new Local[]{entrePosto1, entrePosto3});
        entrePosto1.setProximoCenario(new Local[]{entrePosto2});
        entrePosto1.setCenarioAnterior(new Local[]{poco});
        entrePosto2.setProximoCenario(new Local[]{deserto});
        entrePosto2.setCenarioAnterior(new Local[]{entrePosto1});
        entrePosto3.setProximoCenario(new Local[]{entrePosto4});
        entrePosto3.setCenarioAnterior(new Local[]{poco});
        entrePosto4.setProximoCenario(new Local[]{charco});
        entrePosto4.setCenarioAnterior(new Local[]{entrePosto3});
        charco.setProximoCenario(new Local[]{passagemNorte, passagemSul});
        charco.setCenarioAnterior(new Local[]{entrePosto4});
        deserto.setCenarioAnterior(new Local[]{entrePosto2});
        deserto.setProximoCenario(new Local[]{entrePosto5});
        entrePosto5.setProximoCenario(new Local[]{entrePosto6});
        entrePosto5.setCenarioAnterior(new Local[]{deserto});
        entrePosto6.setProximoCenario(new Local[]{faseFinal});
        entrePosto6.setCenarioAnterior(new Local[]{entrePosto5});
        passagemNorte.setProximoCenario(new Local[]{entrePosto7});
        passagemNorte.setCenarioAnterior(new Local[]{charco});
        passagemSul.setProximoCenario(new Local[]{entrePosto7});
        passagemSul.setCenarioAnterior(new Local[]{charco});
        entrePosto7.setProximoCenario(new Local[]{entrePosto8});
        entrePosto7.setCenarioAnterior(new Local[]{passagemNorte, passagemSul});
        entrePosto8.setProximoCenario(new Local[]{faseFinal});
        entrePosto8.setCenarioAnterior(new Local[]{entrePosto7});
        faseFinal.setCenarioAnterior(new Local[]{entrePosto6, entrePosto8});

        alegrete = new Cenario();
        alegrete.setLocais(new Local[]{poco, deserto, charco, passagemNorte, passagemSul, entrePosto1,
                    entrePosto2, entrePosto3, entrePosto4, entrePosto5, entrePosto6, entrePosto7, entrePosto8,});
    }

    /**
     * Inicialização dos objetos declarados do tipo Desafio
     */
    public void CriaDesafios() {
        CriaRecursosDeAmbiente();
        sobreviverAgua = new Desafio("Beber Água:", "O deserto esta muito quente, voce precisar "
                + "ter um pouco de agua  para tomar agora, se não morrerá", agua, 30);

        atravessarRio = new Desafio("Atravessar o Rio Com a Canoa:", "Esta chovendo, o rio esta muito alto, é preciso"
                + "de uma embarcação passar passar por aqui", canoa, 30);

        derrotarGuardas = new Desafio("Derrotar guardas para entregar a carta:", "A porta do presidente esta com varios guardas"
                + " preciso derrota-los", faca, 30);
    }

    /**
     * Inicialização dos objetos declarados do tipo Ambiente(Recursos de
     * ambiente)
     */
     
    public void CriaRecursosDeAmbiente() {
        agua = new Agua("Agua", 5,30);        
        canoa = new Ambiente("Canoa", 1);
        faca = new Ambiente("Adaga", 1);
    }

    /**
     * Inicialização dos objetos declarados do tipo Pessoal(Recursos do
     * personagem)
     */
    public void CriaRecursosDePersonagem() {
        cantil = new Cantil("Cantil de Agua", 1, 2, "Armazenar 2 litros de agua limpa");
        mapa = new Mapa("Mapa", 1);
    }

    /**
     * Inicialização dos objetos declarados do tipo Alimento
     */
    public void CriaAlimentos() {
        carne = new Alimento("Carne", 2, 35);
        maca = new Alimento("Maça", 5, 10);
        laranja = new Alimento("Laranja", 5, 10);
        frango = new Alimento("Frango", 3, 30);
        pessego = new Alimento("Pessego", 4, 15);
        banana = new Alimento("Banana", 8, 6);
    }

    /**
     * Inicialização das informações do personagem
     *
     * @param nome
     */
    public void CriaPersonagem(String nome) {
        CriaRecursosDePersonagem();
        mensageiro = new Personagem(10);
        mensageiro.setNome(nome);
        mensageiro.setForca(100);
        mensageiro.Pegar(mapa);
        mensageiro.Pegar(cantil);
    }

    public void Escolha(Local cenario, Personagem mensageiro) {
        System.out.println("###################" + cenario.getNome() + "####################");
        System.out.println(cenario.getNarrativa());


        System.out.println(mensageiro.getNome() + " você chegou a(ao)" + cenario.getNome() + ". Digite o numero da ação que deseja executar.");
        if (cenario.getTipo().equalsIgnoreCase("Missao")) {
            OpcoesMissao(cenario, mensageiro);
        } else {
            OpcoesLocaisEntreposto(cenario, mensageiro);
        }
        System.out.println(cenario.OpcoesDeCaminho());
        if (escolhaJogador == 6 && cenario.getProximoCenario() != null) {
            TestaVida(mensageiro);
            System.out.println("Digite o código do caminho e tecle enter para seguir ");
            Escolha(mensageiro.Seguir(cenario, teclado.next()), mensageiro);

        }
        if (escolhaJogador == 7 && cenario.getCenarioAnterior() != null) {
            TestaVida(mensageiro);
            System.out.println("Digite o codigo do caminho que deseja voltar e tecle enter");
            Escolha(mensageiro.Voltar(cenario, teclado.next()), mensageiro);
        } else {
            TestaVida(mensageiro);
            System.out.println("--------- Nenhum caminho, vou voltar para o " + cenario.getNome());
            Escolha(cenario, mensageiro);
        }
        if (alegrete.CenarioFinal(cenario)) {
            System.out.println("Voce chegou ao seu objetivo parabensss! Você entregou a carta ao presidente!");
            System.exit(0);
        }

    }

    public void OpcoesLocaisEntreposto(Local local, Personagem mensageiro) {
        System.out.println("=========================================================");
        System.out.println("1 - comer. 2 - Dormir. 3 - Beber 6- Seguir 7- Voltar");
        escolhaJogador = teclado.nextInt();
        switch (escolhaJogador) {
            case 1:
                System.out.append(mensageiro.Comer(local));
                escolhaJogador = 6;
                break;
            case 2:
                System.out.println(mensageiro.Dormir(local));
                escolhaJogador = 6;
                break;
            case 3:
                mensageiro.UsarOpcoesItem("1", "1", mensageiro, local);
                escolhaJogador = 6;
            case 6:
                if (local.getDesafio() != null) {
                    System.out.println(local.getDesafio().enfrentarDesafio(mensageiro));
                    local.getDesafio().verificaEstado(local, mensageiro);
                }
                break;
        }
        System.out.println("=========================================================");
    }

    public void OpcoesMissao(Local local, Personagem mensageiro) {
        do {
            System.out.println("===============================================================================================================================");
            System.out.println("1 - Verifica Forca. 2 - Procurar Itens. 3 - Habilidade do Tempo. 4 - Usar Itens. 5 - Iventário. 6 - Seguir. 7 - Voltar ");
            escolhaJogador = teclado.nextInt();
            switch (escolhaJogador) {
                case 1:
                    System.out.println(mensageiro.VerificaForca());
                    break;
                case 2:
                    System.out.println(mensageiro.ProcurarItens(local));
                    break;
                case 3:
                    System.out.println(mensageiro.VerificarClima(local));
                    break;
                case 4:
                    String escolhaItem = JOptionPane.showInputDialog(mensageiro.Inventario() + "\n Digite O codigo do Item");
                    String escolhaOpcao = JOptionPane.showInputDialog(mensageiro.UsarItem(escolhaItem) + "\n\n\n Digite o Codigo da Operacao");
                    System.out.println(mensageiro.UsarOpcoesItem(escolhaItem, escolhaOpcao, mensageiro, local));


                    break;
                case 5:
                    System.out.println(mensageiro.Inventario());
                    break;
                case 6:
                    if (local.getDesafio() != null) {
                        System.out.println(local.getDesafio().enfrentarDesafio(mensageiro));
                        local.getDesafio().verificaEstado(local, mensageiro);
                    }
                    break;
            }
        } while (escolhaJogador != 6 && escolhaJogador != 7);
    }

    public void TestaVida(Personagem mensageiro) {
        if (mensageiro.getForca() <= 0) {
            JOptionPane.showMessageDialog(null, "Voce morreu pois nao tem mais força para continuar na sua jornada!");
            System.exit(0);
        }
    }
}
